<?php


    /**
     * @php操作数据库类
     * @class DB_object
     * @constructor
    */
    class DB_object{

        /**
         * @设置默认值
         */ 
        public $host = 'localhost';   // 主机地址
        public $user = 'root';        // 用户名
        public $password = 'root';    // 密码
        public $charset = 'utf8';     // 字符集
        public $db_name = '';         // 数据表
        public $prot = '3306';        // 端口号

        // 保存连接的数据库
        public $conn;

        /**
         * @构造函数 实例化时自动调用
         * @连接mysql数据库
         * @paranm {array} $loca_arr 连接数据库的信息 
        */
        function __construct($loca_arr){
            // 将传进来的参数覆盖掉默认值
            foreach($loca_arr as $k=>$v){
                $this->$k = $v;
            }
            // 连接数据库
            $this->conn = new mysqli($this->host, $this->user, $this->password, $this->db_name, $this->prot);
            if($this->conn->connect_error){
                die('连接数据库失败'.$this->conn->connect_error);
            }
            // 设置字符集
            $this->l_query('set names '.$this->charset);
        }




        /**
         * @执行query语句
         * @paranm (string) (必须)要执行的语句
         * @returns (boolean) $que 查询结果
        */
        public function l_query($sql){
            // 返回布尔值
            $que = $this->conn->query($sql);
            // 如果执行失败返回错误相关的信息
            if(!$que){
                echo 'sql语句执行失败'.'<br>';
                echo '错误代码为:',$this->conn->errno.'<br>';
                echo '错误信息为:',$this->conn->error.'<br>';
            }
            return $que;
        }




        /**
         * @数组拼接字符串
         * @paranm {array} $arr 要操作的数组
         * @paranm {string} $like 要连接的字符 默认为 '='
         * @paranm {string} $partition 要隔开的字符 ','
        */
        public function l_str($arr, $like, $partition){ 
            foreach($arr as $k=>$v){
                @$str .= ($k.$like.$v.$partition);
            }
            $strs = substr($str, 0, -1);
            return $strs;
        }




        /**
         * @查询多条数据
         * @paranm {string} $sql (必须)查询语句
         * @returns {array} $rows 查询到的数据
         * @returns {boolean} false 查询失败
         */ 
        public function l_select_all($sql){
            $res = $this->l_query($sql);
            if($res){
                if($res->num_rows > 0){
                    // 定义空数组存放遍历的结果
                    $rows = array();

                    while($row = $res->fetch_assoc()){
                       $rows[] = $row;
                    }
                    return $rows;
                }
            }else{
                return false;
            }
            
        }




        /**
         * @查询一条数据
         * @paranm {string} $sql (必须)查询语句
         * @returns {array} $rwo 查询到的数据
         * @returns {boolean} false 查询失败
        */
        public function l_select_one($sql){
            $res = $this->l_query($sql);
            if($res){
                if($res->num_rows > 0){
                    return $row = $res->fetch_assoc();
                }
            }else{
                return false;
            }
        }




        /**
         * @插入单条数据
         * @paranm {string} $tab (必须)表名  
         * @paranm {array} $value (必须))要插入的值
         * @paranm {string} $field (可选)指定字段
         * @returns {boolean} true||false 用于判断是否执行成功
        */
        public function l_insert_one($tab, $value, $field = ''){
            $values = join(',', $value);
            $sql = $field ? "insert into {$tab}($field) values($values)" : "insert into {$tab} values($values)";
       
            $res = $this->l_query($sql);
            if(!$res){
                return false;
                exit;
            }
            return true;
        }




        /**
         * @插入多条数据
         * @paranm {string} $tab (必须)表名
         * @paranm {array} $values (必须)要插入的值
         * @paranm {string} $field (可选)指定字段
         * @returns {boolean} true||false 用于判断是否执行成功
        */
        public function l_insert_all($tab, $values, $field = ''){
            if(!is_array($values)) die('ERROR: 要插入表的值必须放在数组里面');
            foreach($values as $v){
                @$str .= "($v),";
            }
            $strs = substr($str, 0, -1);
            $sql = $field ? "insert into {$tab}($field) values{$strs}" : "insert into {$tab} values{$strs}";
            $res = $this->l_query($sql);
            if(!$res){
                return false;
                exit;
            }
            return true;
        }




        /**
         * @更新数据
         * @paranm {string} $tab (必须)表名
         * @paranm {array_assoc} $new_val (必须)数据数组
         * @paranm {string} $condi (可选)更新的条件 没有此参数时,则更新表全部记录
        */
        public function l_update_one($tab, $new_val, $condi = null){
            /*if(!is_array($new_val) || !$tab){
                return false;
            }*/
            // 拼接数据数组
            $strs = $this->l_str($new_val, '=', ',');
            
            @$sql = $condi ? "update {$tab} set {$strs} where {$condi}" : "update {$tab} set {$strs}";
            //echo $sql;
            $res = $this->l_query($sql);
            if(!$res){
                return false;
                exit;
            }
            return true;
        }




        /**
         * @删除数据
         * @paranm {string} $tab (必须)表名
         * @paranm {string} $conde (必须)删除的条件
        */
        public function l_delete_one($tab, $condi){
            // delete from 表名 where 表达式
            $sql = "delete from {$tab} where {$condi}";
            $res = $this->l_query($sql);
            if(!$res){
                return false;
            }else{
                return true;
            }
        }
        
    }


    
    /*$loca_arr = array(
        'host'=> '127.0.0.1',
        'user'=> 'root',
        'password'=> 'root',
        'db_name'=> 'db_shop'
    );*/
    //$p1 = new DB_object($loca_arr);

    //echo '<pre>';
    //var_dump($p1->l_select_one('select * from huiyuan'));
    //$a_arr = array('name'=> "'李10'", 'rel'=> 17, 'sex'=> "'女'");
    //echo $p1->l_delete_one('huiyuan', 'id=50');

?>